#ifndef _GPIO_BITBAND_H_
#define _GPIO_BITBAND_H_

// 定义用于进行位带操作的宏，将一个普通地址和位号转换为位带地址
#define BIT_BAND_ADDRESS(ADDR, BITNUM) (((ADDR) & 0xF0000000) + 0x02000000 + (((ADDR) & 0x000FFFFF) << 5) + ((BITNUM) << 2))

// 定义用于访问位带地址的宏
#define MEMORY_ADDRESS(ADDR)  *((volatile unsigned long *)(ADDR))
#define BIT_ADDRESS(ADDR, BITNUM)   MEMORY_ADDRESS(BIT_BAND_ADDRESS(ADDR, BITNUM))

// 定义各个GPIO端口的输出数据寄存器（ODR）地址
#define GPIOA_OUTPUT_DATA_ADDRESS    (GPIOA_BASE + 20) // GPIOA ODR 地址
#define GPIOB_OUTPUT_DATA_ADDRESS    (GPIOB_BASE + 20) // GPIOB ODR 地址
#define GPIOC_OUTPUT_DATA_ADDRESS    (GPIOC_BASE + 20) // GPIOC ODR 地址
#define GPIOD_OUTPUT_DATA_ADDRESS    (GPIOD_BASE + 20) // GPIOD ODR 地址
#define GPIOE_OUTPUT_DATA_ADDRESS    (GPIOE_BASE + 20) // GPIOE ODR 地址
#define GPIOF_OUTPUT_DATA_ADDRESS    (GPIOF_BASE + 20) // GPIOF ODR 地址
#define GPIOG_OUTPUT_DATA_ADDRESS    (GPIOG_BASE + 20) // GPIOG ODR 地址
#define GPIOH_OUTPUT_DATA_ADDRESS    (GPIOH_BASE + 20) // GPIOH ODR 地址
#define GPIOI_OUTPUT_DATA_ADDRESS    (GPIOI_BASE + 20) // GPIOI ODR 地址

// 定义各个GPIO端口的输入数据寄存器（IDR）地址
#define GPIOA_INPUT_DATA_ADDRESS     (GPIOA_BASE + 16) // GPIOA IDR 地址
#define GPIOB_INPUT_DATA_ADDRESS     (GPIOB_BASE + 16) // GPIOB IDR 地址
#define GPIOC_INPUT_DATA_ADDRESS     (GPIOC_BASE + 16) // GPIOC IDR 地址
#define GPIOD_INPUT_DATA_ADDRESS     (GPIOD_BASE + 16) // GPIOD IDR 地址
#define GPIOE_INPUT_DATA_ADDRESS     (GPIOE_BASE + 16) // GPIOE IDR 地址
#define GPIOF_INPUT_DATA_ADDRESS     (GPIOF_BASE + 16) // GPIOF IDR 地址
#define GPIOG_INPUT_DATA_ADDRESS     (GPIOG_BASE + 16) // GPIOG IDR 地址
#define GPIOH_INPUT_DATA_ADDRESS     (GPIOH_BASE + 16) // GPIOH IDR 地址
#define GPIOI_INPUT_DATA_ADDRESS     (GPIOI_BASE + 16) // GPIOI IDR 地址

// 定义用于GPIO端口的输出操作的宏
#define GPIOA_OUTPUT(N)  BIT_ADDRESS(GPIOA_OUTPUT_DATA_ADDRESS, N) // GPIOA 输出
#define GPIOB_OUTPUT(N)  BIT_ADDRESS(GPIOB_OUTPUT_DATA_ADDRESS, N) // GPIOB 输出
#define GPIOC_OUTPUT(N)  BIT_ADDRESS(GPIOC_OUTPUT_DATA_ADDRESS, N) // GPIOC 输出
#define GPIOD_OUTPUT(N)  BIT_ADDRESS(GPIOD_OUTPUT_DATA_ADDRESS, N) // GPIOD 输出
#define GPIOE_OUTPUT(N)  BIT_ADDRESS(GPIOE_OUTPUT_DATA_ADDRESS, N) // GPIOE 输出
#define GPIOF_OUTPUT(N)  BIT_ADDRESS(GPIOF_OUTPUT_DATA_ADDRESS, N) // GPIOF 输出
#define GPIOG_OUTPUT(N)  BIT_ADDRESS(GPIOG_OUTPUT_DATA_ADDRESS, N) // GPIOG 输出
#define GPIOH_OUTPUT(N)  BIT_ADDRESS(GPIOH_OUTPUT_DATA_ADDRESS, N) // GPIOH 输出
#define GPIOI_OUTPUT(N)  BIT_ADDRESS(GPIOI_OUTPUT_DATA_ADDRESS, N) // GPIOI 输出

// 定义用于GPIO端口的输入操作的宏
#define GPIOA_INPUT(N)   BIT_ADDRESS(GPIOA_INPUT_DATA_ADDRESS, N)  // GPIOA 输入
#define GPIOB_INPUT(N)   BIT_ADDRESS(GPIOB_INPUT_DATA_ADDRESS, N)  // GPIOB 输入
#define GPIOC_INPUT(N)   BIT_ADDRESS(GPIOC_INPUT_DATA_ADDRESS, N)  // GPIOC 输入
#define GPIOD_INPUT(N)   BIT_ADDRESS(GPIOD_INPUT_DATA_ADDRESS, N)  // GPIOD 输入
#define GPIOE_INPUT(N)   BIT_ADDRESS(GPIOE_INPUT_DATA_ADDRESS, N)  // GPIOE 输入
#define GPIOF_INPUT(N)   BIT_ADDRESS(GPIOF_INPUT_DATA_ADDRESS, N)  // GPIOF 输入
#define GPIOG_INPUT(N)   BIT_ADDRESS(GPIOG_INPUT_DATA_ADDRESS, N)  // GPIOG 输入
#define GPIOH_INPUT(N)   BIT_ADDRESS(GPIOH_INPUT_DATA_ADDRESS, N)  // GPIOH 输入
#define GPIOI_INPUT(N)   BIT_ADDRESS(GPIOI_INPUT_DATA_ADDRESS, N)  // GPIOI 输入

#endif // _GPIO_BITBAND_H_
